0%

【算法导论】最大值和最小值

时间复杂度:$O(3*floor(n/2))$

基本思想:成对地处理元素。先将一对输入元素相互比较,然后把较小的与当前最小值比较,较大的与当前最大值比较,因此每两个元素比较三次。

注意分情况:当n为奇数时,将最大值和最小值都设置为第一个元素值;当n为偶数时,将前两个元素较大的元素设置为最大值,较小的设置为最小值。

其具体实现如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include<stdio.h>

void MinMax(int* arrayA,int n,int* minmax);

void main()
{
int minmax[2]={0};
int arrayA[10]={4,1,5,7,0,2,5,3,2,9};
int n=sizeof(arrayA)/sizeof(int);

MinMax(arrayA,n,minmax);

printf("Min=%d Max=%d\n",minmax[0],minmax[1]);
}

/**************************************************\
函数功能:查找最大值和最小值
输入:原始数组、用于存储最大最小值的数组
输出:无
\**************************************************/
void MinMax(int* arrayA,int n,int* minmax)
{
int min=0;//初始化
int max=0;

if(n%2==0)//n为奇数
{
if(arrayA[0]>arrayA[1])
{
max=arrayA[0];
min=arrayA[1];//最大最小值分别赋值为第一二元素
}
else
{
max=arrayA[1];
min=arrayA[0];
}

for(int i=2;i<n-1;i++)
{
if(arrayA[i]>arrayA[i+1])
{
if(arrayA[i]>max)
max=arrayA[i];
if(arrayA[i+1]<min)
min=arrayA[i+1];
}
else
{
if(arrayA[i+1]>max)
max=arrayA[i+1];
if(arrayA[i]<min)
min=arrayA[i];
}

}
}
else//n为偶数
{
max=min=arrayA[0];//最大最小值都赋值为第一个元素
for(int j=1;j<n-1;j++)
{
if(arrayA[j]>arrayA[j+1])
{
if(arrayA[j]>max)
max=arrayA[j];
if(arrayA[j+1]<min)
min=arrayA[j+1];
}
else
{
if(arrayA[j+1]>max)
max=arrayA[j+1];
if(arrayA[j]<min)
min=arrayA[j];
}

}


}
minmax[0]=min;
minmax[1]=max;
}
坚持原创技术分享,您的支持将鼓励我继续创作!